﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

using Microsoft.Extensions.DependencyInjection;

using Xc.DataAccess.Docs.MarkDowns;
using Xc.DataAccess.Docs.Services;

namespace Xc.Build.Docs
{
    internal class Program
    {
        public static void Main()
        {
            ServiceCollection serviceDescriptors=new ServiceCollection();
            serviceDescriptors.AddPanDocService();
            var provider= serviceDescriptors.BuildServiceProvider();
            IWriteContextService writeContext = provider.GetService<IWriteContextService>();

            writeContext.AppendRefLine(1, "微信公众号排版工具。问题或建议，请公众号留言。");
            writeContext.AppendLine(s =>
            {
                s.Append("建议使用");
                s.AppendBold("Chrome");
                s.Append("浏览器，体验最佳效果");
            });
            writeContext.AppendLine("使用微信公众号编辑器有一个十分头疼的问题：粘贴出来的代码，格式错乱，空间小还带行号，而且特别丑。Markdown.com.cn编辑器能够解决这个问题。");
            writeContext.AppendLine("Markdown是一种轻量级的「标记语言」。");
            writeContext.AppendLine("请阅读下方文本熟悉工具使用方法，本文可直接拷贝到微信中预览。");
            writeContext.AppendHead(2, (s) =>
            {
                s.Append("1 Markdown.com.cn 简介");
            });
            writeContext.AppendUnderOrderList("-", "支持自定义样式的 Markdown 编辑器");
            writeContext.AppendUnderOrderList("-", "支持微信公众号、知乎和稀土掘金");
            writeContext.AppendUnderOrderList("-", "点击右上方对应图标，一键复制到各平台");
            writeContext.AppendHead(2, (s) =>
            {
                s.Append("2 Markdown语法教程");
            });
            writeContext.AppendHead(3, (s) =>
            {
                s.Append("2.1 标题");
            });
            writeContext.AppendLine("不同数量的`#`可以完成不同的标题，如下：");
            writeContext.AppendHead(1, "一级标题");
            writeContext.AppendHead(2, "二级标题");
            writeContext.AppendHead(3, "三级标题");
            writeContext.AppendHead(3, "2.2 字体");
            writeContext.AppendLine("粗体、斜体、粗体和斜体，删除线，需要在文字前后加不同的标记符号。如下：");

            writeContext.AppendBoldLine("这个是粗体");
            writeContext.AppendItalic("这个是斜体");
            writeContext.AppendBoldItalicLine("这个是粗体加斜体");
            writeContext.AppendDeleteLine("这里想用删除线");
            writeContext.AppendLine("注：如果想给字体换颜色、字体或者居中显示，需要使用内嵌HTML来实现。");
            writeContext.AppendHead(3, "2.3 无序列表");
            writeContext.AppendLine("无序列表的使用，在符号`-`后加空格使用。如下：");
            writeContext.AppendUnderOrderList("-", "无序列表 1");
            writeContext.AppendUnderOrderList("-", "无序列表 2");
            writeContext.AppendUnderOrderList("-", "无序列表 3");
            writeContext.AppendLine("如果要控制列表的层级，则需要在符号`-`前使用空格。如下：");
            writeContext.AppendUnderOrderList("-", "无序列表 1");
            writeContext.AppendUnderOrderList("-", "无序列表 2");
            writeContext.AppendUnderOrderList("\t-", "无序列表 2.1");
            writeContext.AppendUnderOrderList("\t-", "无序列表 2.2");
            writeContext.AppendBoldLine("由于微信原因，最多支持到二级列表");
            writeContext.AppendOrderList(1, "有序列表 1");
            writeContext.AppendOrderList(2, "有序列表 2");
            writeContext.AppendOrderList(3, "有序列表 3");
            writeContext.AppendHead(3, "2.5 引用");
            writeContext.AppendLine("引用的格式是在符号`>`后面书写文字。如下：");
            writeContext.AppendRefLine(1, "读一本好书，就是在和高尚的人谈话。 ——歌德");
            writeContext.AppendRefLine(1, "雇用制度对工人不利，但工人根本无力摆脱这个制度。 ——阮一峰");
            writeContext.AppendHead(3, "2.7 链接");
            writeContext.AppendLine("微信公众号仅支持公众号文章链接，即域名为`https://mp.weixin.qq.com/`的合法链接。使用方法如下所示：");
            writeContext.AppendLine(c =>
            {
                c.Append("对于该论述，欢迎读者查阅之前发过的文章，");
                c.AppendLink("你是《未来世界的幸存者》么？", "https://mp.weixin.qq.com/s/s5IhxV2ooX3JN_X416nidA", String.Empty);
            });
            writeContext.AppendHead(3, "2.8 图片");
            writeContext.AppendLine("插入图片，格式如下：");
            writeContext.AppendImage("这里写图片描述", "https://www.nginx.cn/wp-content/uploads/2020/03/qrcode_for_gh_82cf87d482f0_258.jpg", String.Empty);
            writeContext.AppendLine(s =>
            {
                s.Append("支持 jpg、png、gif、svg 等图片格式，");
                s.AppendBold("其中 svg 文件仅可在微信公众平台中使用");
                s.Append("svg 文件示例如下：");
            });
            writeContext.AppendImage("", "https://markdown.com.cn/images/i-am-svg.svg", String.Empty);
            writeContext.AppendLine(s =>
            {
                s.Append("支持图片");
                s.AppendBold("拖拽和截图粘贴");
                s.Append("到编辑器中");
            });
            writeContext.AppendLine(s =>
            {
                s.Append("注：支持图片").AppendBold("拖拽和截图粘贴").Append("到编辑器中，仅支持 https 的图片，图片粘贴到微信时会自动上传微信服务器。");
            });
            writeContext.AppendHead(3, "2.9 分割线");
            writeContext.AppendLine("可以在一行中用三个以上的减号来建立一个分隔线，同时需要在分隔线的上面空一行。如下：");
            writeContext.AppendHorizontalLine();

            writeContext.AppendHead(3, "2.10 表格");
            writeContext.AppendLine("可以使用冒号来定义表格的对齐方式，如下：");
            writeContext.AppendDataTable(s =>
            {
                s.AppendColumn("姓名").AppendColumn(new Column("年龄", Aligment.Center)).AppendColumn(new Column("工作", Aligment.Right));
                s.AppendRow("小可爱", "18", "吃可爱多");
                s.AppendRow("小小勇敢", "20", "爬勇敢树");
                s.AppendRow("小小小机智", "22", "看一本机智书");
            });
            writeContext.AppendHead(2, "3 特殊语法");
            writeContext.AppendHead(3, "3.1 脚注");
            writeContext.AppendRefLine(1, "支持平台：微信公众号、知乎");
            writeContext.AppendCode("markdown", s =>
            {
                s.AppendLine(content =>
                {
                    content.Append("链接：").AppendLink("文字", "链接", String.Empty);
                });
                s.AppendLine(d =>
                {
                    s.Append("脚注：").AppendLink("文字", "脚注解释", "脚注名字");
                });

            });
            writeContext.AppendLine(d =>
            {
                d.Append("有人认为在").AppendLink("大前端时代", "https://en.wikipedia.org/wiki/Front-end_web_development", "Front-end web development");
                d.Append("的背景下，移动端开发（Android、IOS）将逐步退出历史舞台。");
            });
            writeContext.AppendLine(d =>
            {
                d.AppendLink("全栈工程师", "是指掌握多种技能，并能利用多种技能独立完成产品的人。", "什么是全栈工程师");
                d.Append("在业务开发流程中起到了至关重要的作用。");
            });
            writeContext.AppendLine("脚注内容请拉到最下面观看。");

            writeContext.AppendHead(3, "3.2 代码块");
            writeContext.AppendRef(1, "支持平台：微信代码主题仅支持微信公众号！其他主题无限制");
            writeContext.AppendLine("如果在一个行内需要引用代码，只要用反引号引起来就好，如下：");
            writeContext.AppendLine(c =>
            {
                c.Append("Use the ");
                c.AppendCodeSimple("printf()").Append("function");

            });
            writeContext.AppendLine(s =>
            {
                s.Append("在需要高亮的代码块的前一行及后一行使用三个反引号，同时");
                s.AppendBold("第一行反引号后面表示代码块所使用的语言");
                s.Append("，如下：");
            });
            writeContext.AppendCode("java", "public void Main(){}");
            Console.WriteLine(writeContext);
            writeContext.SaveToFile("test.md");
            var doc=   provider.GetService<IPanDocService>();
            doc.Docx("test.md","export.docx");
            doc.OpenExportFile();
            Console.ReadLine();


        }
    }
}
